package com.edu.exam.entity.grading;

import com.edu.exam.enums.grading.GradeScoreType;
import com.edu.exam.enums.grading.GradeType;
import com.edu.exam.enums.grading.ValidationRuleType;
import com.edu.exam.enums.grading.ValidationErrorLevel;
import com.edu.exam.enums.grading.RuleApplicableScope;
import com.edu.exam.enums.grading.RuleCreatorType;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

import java.time.LocalDateTime;

/**
 * 成绩验证规则实体类
 * 所属模块：B-06 成绩管理模块
 *
 * <p>成绩验证规则实体用于存储成绩验证的规则配置，包含
 * 规则定义、类型管理、激活状态、表达式解析等。确保成绩数据的准确性和一致性。</p>
 *
 * <p>核心功能：
 * - 规则存储：存储各种成绩验证规则
 * - 规则类型：支持多种验证规则类型
 * - 表达式解析：支持动态规则表达式
 * - 激活控制：控制规则的生效状态
 * - 课程关联：支持课程级别的规则定制</p>
 *
 * @author 系统生成
 * @version 1.0
 * @since 2025-11-10
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Entity
@EntityListeners(AuditingEntityListener.class)
public class GradeValidationRule {

    /**
     * 主键ID
     */
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    /**
     * 课程ID
     *
     * <p>规则关联的课程ID，为空表示全局规则。</p>
     */
    @Column(name = "course_id", length = 50)
    private String courseId;

    /**
     * 规则类型
     *
     * <p>验证规则的类型标识。
     * 支持的类型：SCORE_RANGE（分数范围）、REQUIRED（必填项）、FORMAT（格式验证）、LOGIC_CHECK（逻辑检查）、BUSINESS_RULE（业务规则）</p>
     */
    @Enumerated(EnumType.STRING)
    @Column(name = "rule_type", nullable = false, length = 50)
    private ValidationRuleType ruleType;

    /**
     * 规则名称
     *
     * <p>规则的描述性名称。</p>
     */
    @Column(name = "rule_name", nullable = false, length = 100)
    private String ruleName;

    /**
     * 规则表达式
     *
     * <p>验证规则的表达式，用于动态验证。</p>
     */
    @Column(name = "rule_expression", nullable = false, length = 500)
    private String ruleExpression;

    /**
     * 规则描述
     *
     * <p>规则的详细描述说明。</p>
     */
    @Column(name = "rule_description", nullable = false, length = 500)
    private String ruleDescription;

    /**
     * 是否激活
     *
     * <p>规则是否处于激活状态。</p>
     */
    @Column(name = "is_active", nullable = false)
    private Boolean isActive = true;

    /**
     * 优先级
     *
     * <p>规则的执行优先级，数值越小优先级越高。</p>
     */
    @Column(name = "priority")
    private Integer priority = 0;

    /**
     * 错误级别
     *
     * <p>验证失败时的错误级别。
     * 支持的级别：ERROR（错误）、WARNING（警告）、INFO（信息）</p>
     */
    @Enumerated(EnumType.STRING)
    @Column(name = "error_level", length = 20)
    private ValidationErrorLevel errorLevel = ValidationErrorLevel.ERROR;

    /**
     * 错误消息模板
     *
     * <p>验证失败时的错误消息模板。</p>
     */
    @Column(name = "error_message_template", length = 500)
    private String errorMessageTemplate;

    /**
     * 规则参数
     *
     * <p>规则的相关参数，JSON格式存储。</p>
     */
    @Column(name = "rule_parameters", columnDefinition = "TEXT")
    private String ruleParameters;

    /**
     * 适用对象
     *
     * <p>规则适用的对象范围。
     * 支持的对象：ALL（全部）、PERCENTAGE（百分制）、LEVEL（等级制）</p>
     */
    @Enumerated(EnumType.STRING)
    @Column(name = "applicable_to", length = 20)
    private RuleApplicableScope applicableTo = RuleApplicableScope.ALL;

    /**
     * 生效时间
     *
     * <p>规则生效的开始时间。</p>
     */
    @Column(name = "effective_from")
    private LocalDateTime effectiveFrom;

    /**
     * 失效时间
     *
     * <p>规则失效的时间。</p>
     */
    @Column(name = "effective_to")
    private LocalDateTime effectiveTo;

    /**
     * 创建者类型
     *
     * <p>规则创建者的类型。
     * 支持的类型：SYSTEM（系统）、ADMIN（管理员）、TEACHER（教师）</p>
     */
    @Enumerated(EnumType.STRING)
    @Column(name = "creator_type", length = 20)
    private RuleCreatorType creatorType = RuleCreatorType.SYSTEM;

    /**
     * 使用次数
     *
     * <p>规则被使用的次数统计。</p>
     */
    @Column(name = "usage_count", nullable = false)
    private Long usageCount = 0L;

    /**
     * 最后使用时间
     *
     * <p>规则最后被使用的时间。</p>
     */
    @Column(name = "last_used_time")
    private LocalDateTime lastUsedTime;

    /**
     * 规则版本
     *
     * <p>规则的版本号。</p>
     */
    @Column(name = "rule_version", length = 20)
    private String ruleVersion = "1.0";

    /**
     * 关联规则组
     *
     * <p>规则所属的规则组。</p>
     */
    @Column(name = "rule_group", length = 50)
    private String ruleGroup;

    /**
     * 规则标签
     *
     * <p>JSON格式的规则标签，用于分类和过滤。</p>
     */
    @Column(name = "rule_tags", columnDefinition = "TEXT")
    private String ruleTags;

    /**
     * 规则备注
     *
     * <p>规则的备注信息。</p>
     */
    @Column(name = "rule_notes", columnDefinition = "TEXT")
    private String ruleNotes;

    // ===== 审计字段 =====

    /**
     * 创建时间
     */
    @CreatedDate
    @Column(name = "create_time", nullable = false, updatable = false)
    private LocalDateTime createTime;

    /**
     * 更新时间
     */
    @LastModifiedDate
    @Column(name = "update_time", nullable = false)
    private LocalDateTime updateTime;

    /**
     * 创建用户ID
     */
    @Column(name = "create_user_id", length = 50)
    private String createUserId;

    /**
     * 更新用户ID
     */
    @Column(name = "update_user_id", length = 50)
    private String updateUserId;

    /**
     * 是否删除
     */
    @Column(name = "is_deleted", nullable = false)
    private Boolean isDeleted = false;

    /**
     * 删除时间
     */
    @Column(name = "delete_time")
    private LocalDateTime deleteTime;

    /**
     * 删除用户ID
     */
    @Column(name = "delete_user_id", length = 50)
    private String deleteUserId;

    // ===== 枚举已迁移 =====
    // 嵌入枚举已迁移到专用枚举包:
    // - RuleType -> ValidationRuleType (enums/grading包)
    // - ErrorLevel -> ValidationErrorLevel (enums/grading包)
    // - ApplicableTo -> RuleApplicableScope (enums/grading包)
    // - CreatorType -> RuleCreatorType (enums/grading包)

}
